package com.wyth.lottery.utils;

import java.util.ArrayList;


public class MathD {
	
	/**
	 * 双色球拆票胆拖
	 * @param dan 红球胆码号码数组
	 * @param tuo 红球拖码号码数组
	 * @param blues 蓝色球号码数组
	 * @return
	 */
	public static ArrayList<Object[]> splitShuangSeQiuDT(Object[] dan, Object[] tuo, Object[] blues){
		int n=6-dan.length;
		//获取组合结果
		ArrayList<Object[]> redList=cmn(tuo, n);
		//与胆码、蓝球组合
		ArrayList<Object[]> result=new ArrayList<>();
		for (Object blue:blues) {
			for (Object[] r:redList) {
				 Object[] re=new Object[7];
				 for (int i = 0; i < dan.length; i++) {
					re[i]=dan[i];
				 }
				 int j=0;
				 for (int i = dan.length; i < (r.length+dan.length); i++) {
					re[i]=r[j];
					j++;
				}
				re[6]=blue;
				result.add(re);
			}
		}
		return result;
	}
	
	/**
	 * 双色球拆票
	 * @param reds 红球号码数组
	 * @param blues 蓝球号码数组
	 * @return 拆票结果
	 */
	public static ArrayList<Object[]> splitShuangSeQiu(Object[] reds, Object[] blues){
		//获取组合结果
		ArrayList<Object[]> redList=cmn(reds, 6);
		//与蓝球组合
		ArrayList<Object[]> result=new ArrayList<>();
		for (Object blue:blues) {
			for (Object[] r:redList) {
				 Object[] re=new Object[7];
				 for (int i = 0; i < r.length; i++) {
					re[i]=r[i];
				}
				re[6]=blue;
				result.add(re);
			}
		}
		return result;
	}

	private static ArrayList<Object[]> cmn(Object[] source, int n){
        ArrayList<Object[]> result=new ArrayList<Object[]>();
        if(n==1)
        {
            for(int i=0;i<source.length;i++)
            {
                result.add(new Object[]{source[i]});
                
            }
        }
        else if(source.length==n)
        {
            result.add(source);
        }
        else
        {
            Object[] psource=new Object[source.length-1];
            for(int i=0;i<psource.length;i++)
            {
                psource[i]=source[i];
            }
            result=cmn(psource,n);
            ArrayList<Object[]> tmp=cmn(psource,n-1);
            for(int i=0;i<tmp.size();i++)
            {
                Object[] rs=new Object[n];
                for(int j=0;j<n-1;j++)
                {
                    rs[j]=tmp.get(i)[j];
                }
                rs[n-1]=source[source.length-1];
                result.add(rs);
            }
        }
        return result;
    }
	
	/**
	 * 七乐彩胆拖玩法注数计算
	 * @param dan 选中胆码的个数，需<=6
	 * @param tuo 选中拖码的个数，需<=29
	 * @return
	 */
	public static int number7LDT(int dan,int tuo){
		int a=7-dan;
		int re=c(tuo,a);
		return re;
	}
	
	/**
	 * 七乐彩普通玩法注数计算
	 * @param selected 选中号码的个数，需>=7
	 * @return
	 */
	public static int number7L(int selected){
		int re=c(selected,7);
		return re;
	}
	
	/**
	 * 福彩3D组六复试注数计算
	 * @param selected 选中号码的个数，需>=3
	 * @return
	 */
	public static int number3DZu6(int selected){
		int re=c(selected,3);
		return re;
	}
	
	/**
	 * 福彩3D组三复试注数计算
	 * @param selected 选中号码的个数，需>=2
	 * @return
	 */
	public static int number3DZu3(int selected){
		return selected*(selected-1);
	}
	
	/**
	 * 福彩3D直选注数计算
	 * @param bai 百位选中号码的个数
	 * @param shi 十位选中号码的个数
	 * @param ge 个位选中号码的个数
	 * @return
	 */
	public static int number3D(int bai,int shi,int ge){
		return bai*shi*ge;
	}
	
	/**
	 * 双色球注数计算——胆拖投注
	 * @param dan 胆码个数，胆码最多5个
	 * @param tuo 拖码个数，拖码至少选择2个
	 * @param blue 蓝色个数，至少一个
	 * @return 双色球胆拖投注注数
	 */
	public static int numberDT(int dan,int tuo,int blue){
		int a=6-dan;
		int re=c(tuo,a)*blue;
		return re;
	}
	
	/**
	 * 雙色球注數計算
	 * @param red 紅色球個數
	 * @param blue 藍色球個數
	 * @return 雙色球注數
	 */
	public static int number(int red,int blue){
		int re=c(red,6)*blue;
		return re;
	}
	
	/**
	 * 求組合的結果
	 * @param n
	 * @param m
	 * @return C(n,m)的結果
	 */
	public static int c(int n, int m){
		return chengfa(n, m)/jiecheng(m);
	}
	
	private static int jiecheng(int p){
		int a = 1;
		for(int i = 1; i < p+1; i++){
			a = i * a;
		}
		return a;
	}

	private static int chengfa(int b,int c){
		int d = 1;
		for(int i = b; i > b-c; i--){
			d = i * d;
		}
		return d;
	}	
}
